﻿#include<iostream>
using namespace std;

typedef struct Role {
	char* Name;
	int Hp;
	int MaxHp;
	int Mp;
	int MaxMp;
	int lv;
} *PROLE, ROLE;


int clen(const char* str) {
	int i;
	for (i = 0; str[i]; i++);
	return ++i;
}

char* cstr(const char* str) {

	int len = clen(str);
	cout << len << endl;//5

	//char strRt[0x20];//无法返回是因为该变量是局部字符变量，没办法成功返回

	char* strRt = new char[len];//成功，因为该变量是指针，能返回堆上的内存地址，如果要删掉需要用delete()

	memcpy(strRt, str, len);

	return strRt;

}

ROLE CreateMonster(const char* str, int Hp, int Mp) {
	Role rt{ cstr(str),Hp,Hp,Mp,Mp,1 };
	return rt;
}

PROLE CreateMonster(const char* str, int Hp, int Mp) {

	//Role rt{ cstr(str),Hp,Hp,Mp,Mp,1 };
	//return &rt;//这种方式返回的是局部变量，因为rt不是指针

	PROLE rt = new ROLE{ cstr(str),Hp,Hp,Mp,Mp,1 };
	return rt;
}

Role& CreateMonster(const char* str, int Hp, int Mp) {//返回引用，缺陷是无法返回空

	PROLE rt = new ROLE{ cstr(str),Hp,Hp,Mp,Mp,1 };
	cout << typeid(rt).name() << endl;
	cout << typeid(*rt).name() << endl;
	return *rt;
}

void Add(int& a) {
	a += 100;
}

void ave(int(&art)[100]) {
	cout << sizeof(art) << endl;
	for (auto x : art);
}


int main() {
	char* str;
	str = (char*)("你好");//const char[5]
	cout << &str << endl;//0000007647DBF7D8，str指针的内存地址
	//cout << hex << (int) * str << endl;//ffffffc4，str指针的第一个内容
	cout << (int*)str << endl;//00007FF6F8A2BD34，str指针内存储的地址
	cout << &("你好") << endl;//00007FF6F8A2BD34，字符串地址
	cout << &("你好") << endl;//00007FF6F8A2BD34，没改变
	cout << str << endl;//你好
	//str[0] = 0;//对于str=(char*)("你好")报错，"你好"是常量，无法修改

	str = cstr("你好");

	int a[]{ 1,2,3,4,5 };
	int* a1;
	a1 = a;
	cout << &a1 << endl;//000000BDD399F668，指针的内存地址
	cout << *a1 << endl;//1,第一个位置的内容
	cout << a1 << endl;//00000033BCB7FC48，指针指向的内存地址
	a1[1] = 0;
	cout << a[1] << endl;//0

	//ROLE role = CreateMonster("aoteman", 1500, 1500);//用变量方式会2次赋值造成性能浪费
	Role role = CreateMonster("aoteman", 1500, 1500);
	cout << role.Name << endl;
	cout << role.Hp << "/" << role.MaxHp << endl;

	float p = 250.60f;
	Add(p);//报错，类型转换出问题

	int d[100];
	int& b[100] = b;//编译器过不去
	int(&b)[100] = d;//引用100个元素的数组

	ave(d);
}